﻿using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Text;
using System.IO;
using System.Dynamic;
using FluorineFx.Json;

namespace lxwmvc
{
    public static class apicontroller
    {
        /// <summary>
        /// 全局引用
        /// </summary>
        /// <param name="pb"></param>
        public static void _init(pagebase pb)
        {

        }

        
        /// <summary>
        /// 批量生成实体
        /// </summary>
        /// <param name="pb"></param>
        public static void lxw_m(pagebase pb)
        {
            string sql = @"
SELECT
    TableName=CASE WHEN C.column_id=1 THEN O.name ELSE N'' END,
    TableDesc=ISNULL(CASE WHEN C.column_id=1 THEN PTB.[value] END,N''),
    Column_id=C.column_id,
    ColumnName=C.name,
    PrimaryKey=ISNULL(IDX.PrimaryKey,N''),
    [IDENTITY]=CASE WHEN C.is_identity=1 THEN N'√'ELSE N'' END,
    Computed=CASE WHEN C.is_computed=1 THEN N'√'ELSE N'' END,
    Type=T.name,
    Length=C.max_length,
    Precision=C.precision,
    Scale=C.scale,
    NullAble=CASE WHEN C.is_nullable=1 THEN N'√'ELSE N'' END,
    [Default]=ISNULL(D.definition,N''),
    ColumnDesc=ISNULL(PFD.[value],N''),
    IndexName=ISNULL(IDX.IndexName,N''),
    IndexSort=ISNULL(IDX.Sort,N''),
    Create_Date=O.Create_Date,
    Modify_Date=O.Modify_date
FROM sys.columns C
    INNER JOIN sys.objects O
        ON C.[object_id]=O.[object_id]
            AND O.type='U'
            AND O.is_ms_shipped=0
    INNER JOIN sys.types T
        ON C.user_type_id=T.user_type_id
    LEFT JOIN sys.default_constraints D
        ON C.[object_id]=D.parent_object_id
            AND C.column_id=D.parent_column_id
            AND C.default_object_id=D.[object_id]
    LEFT JOIN sys.extended_properties PFD
        ON PFD.class=1
            AND C.[object_id]=PFD.major_id
            AND C.column_id=PFD.minor_id
--             AND PFD.name='Caption'  -- 字段说明对应的描述名称(一个字段可以添加多个不同name的描述)
    LEFT JOIN sys.extended_properties PTB
        ON PTB.class=1
            AND PTB.minor_id=0
            AND C.[object_id]=PTB.major_id
--             AND PFD.name='Caption'  -- 表说明对应的描述名称(一个表可以添加多个不同name的描述)
    LEFT JOIN                       -- 索引及主键信息
    (
        SELECT
            IDXC.[object_id],
            IDXC.column_id,
            Sort=CASE INDEXKEY_PROPERTY(IDXC.[object_id],IDXC.index_id,IDXC.index_column_id,'IsDescending')
                WHEN 1 THEN 'DESC' WHEN 0 THEN 'ASC' ELSE '' END,
            PrimaryKey=CASE WHEN IDX.is_primary_key=1 THEN N'√'ELSE N'' END,
            IndexName=IDX.Name
        FROM sys.indexes IDX
        INNER JOIN sys.index_columns IDXC
            ON IDX.[object_id]=IDXC.[object_id]
                AND IDX.index_id=IDXC.index_id
        LEFT JOIN sys.key_constraints KC
            ON IDX.[object_id]=KC.[parent_object_id]
                AND IDX.index_id=KC.unique_index_id
        INNER JOIN  -- 对于一个列包含多个索引的情况,只显示第1个索引信息
        (
            SELECT [object_id], Column_id, index_id=MIN(index_id)
            FROM sys.index_columns
            GROUP BY [object_id], Column_id
        ) IDXCUQ
            ON IDXC.[object_id]=IDXCUQ.[object_id]
                AND IDXC.Column_id=IDXCUQ.Column_id
                AND IDXC.index_id=IDXCUQ.index_id
    ) IDX
        ON C.[object_id]=IDX.[object_id]
            AND C.column_id=IDX.column_id
            
            
           ";

            DataTable dt = sqlhelper.out_getds(sql).Tables[0];
            string tablename = "";
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                if (dt.Rows[i]["tablename"].tostr().Length > 0)
                {
                    tablename = dt.Rows[i]["tablename"].tostr();
                }
                else
                {
                    //赋值，把没有信息的补全
                    dt.Rows[i]["tablename"] = tablename;
                }
            }

            StringBuilder sb = new StringBuilder();

            string t = @"
// ===============================================================================
// 实体类及实体描述自动生成，建议不要修改，如果数据库有变更，请重新生成即可
// 最后的生成时间:{0}
// ==============================================================================";

            sb.AppendFormat(t, DateTime.Now);

            sb.Append(@"
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Text;
using System.IO;
using System.Dynamic;");

            sb.AppendLine("");
            sb.AppendLine("");
            sb.AppendLine("namespace lxwmvc");
            sb.AppendLine("{");

            var tbs = dt.Select("tablename<>''");

            //columnname,primarykey,inentity,type,length,precision,scale,NullAble,default,columnDesc,create_date,modify_date
            List<string> list = new List<string>();
            
            foreach (DataRow dr in tbs)
            {
                if (list.Contains(dr["tablename"] + "")) continue;
                list.Add(dr["tablename"] + "");
                sb.AppendLine("     /// <summary>");
                sb.AppendLine("     /// " + dr["tablename"]);
                sb.AppendLine("     /// </summary>");
                sb.AppendLine("     public class _" + dr["tablename"]+"_");
                sb.AppendLine("     {");
                sb.AppendLine("          /// <summary>表名</summary>");
                sb.AppendLine("          public static string TABLE_NAME = \"" + dr["tablename"]+"\";");
                var rs = dt.Select("tablename='" + dr["tablename"] + "'");
                foreach (DataRow dr2 in rs)
                {
                    string c = dr2["columnname"].tostr();
                    if (c.IndexOf('=') != -1) continue;
                    sb.AppendLine("         /// <summary>");
                    sb.AppendLine("         /// 描述=>" + dr2["columnDesc"].tostr().Replace("\n","").Replace("\r","") + "");
                    sb.AppendLine("         /// <para>primarykey="+dr2["primarykey"]+"</para>");
                    sb.AppendLine("         /// <para>IDENTITY=" + dr2["IDENTITY"] + "</para>");
                    sb.AppendLine("         /// <para>type=" + dr2["type"] + "</para>");
                    sb.AppendLine("         /// <para>length=" + dr2["length"] + "</para>");
                    sb.AppendLine("         /// <para>NullAble=" + dr2["NullAble"] + "</para>");
                    sb.AppendLine("         /// <para>default=" + dr2["default"] + "</para>");
                    sb.AppendLine("         /// <para>precision=" + dr2["precision"] + "</para>");
                    sb.AppendLine("         /// <para>scale=" + dr2["scale"] + "</para>");
                    sb.AppendLine("         /// <para>modify_date=" + dr["modify_date"] + "</para>");


                    sb.AppendLine("         /// <para>create_date=" + dr2["create_date"] + "</para>");
                    sb.AppendLine("         /// </summary>");
                    sb.AppendLine("         public static string " + dr2["columnname"] + " = \"" + dr2["columnname"] + "\";");                    
                }
                
                sb.AppendLine("     }");
            }


            list.Clear();
            foreach (DataRow dr in tbs)
            {
                if (list.Contains(dr["tablename"] + "")) continue;
                list.Add(dr["tablename"] + "");
                sb.AppendLine("     /// <summary>");
                sb.AppendLine("     /// "+dr["tablename"]);
                sb.AppendLine("     /// </summary>");
                sb.AppendLine("     public class _" + dr["tablename"]+":supermodel");
                sb.AppendLine("     {");

                sb.AppendLine("         /// <summary>");
                sb.AppendLine("         /// " + dr["tablename"]);
                sb.AppendLine("         /// </summary>");
                sb.AppendLine("         public _" + dr["tablename"] + "():base(_" + dr["tablename"] + "_.TABLE_NAME){}");
                var rs = dt.Select("tablename='" + dr["tablename"] + "'");
                foreach (DataRow dr2 in rs)
                {
                    string c = dr2["columnname"].tostr();
                    if (c.IndexOf('=') != -1) continue;
                    sb.AppendLine("         /// <summary>");
                    sb.AppendLine("         /// =>字段信息：" + dr2["columnDesc"].tostr().Replace("\n","").Replace("\r","") + "");
                    sb.AppendLine("         /// <para>primarykey="+dr2["primarykey"]+"</para>");
                    sb.AppendLine("         /// <para>IDENTITY=" + dr2["IDENTITY"] + "</para>");
                    sb.AppendLine("         /// <para>type=" + dr2["type"] + "</para>");
                    sb.AppendLine("         /// <para>length=" + dr2["length"] + "</para>");
                    sb.AppendLine("         /// <para>NullAble=" + dr2["NullAble"] + "</para>");
                    sb.AppendLine("         /// <para>default=" + dr2["default"] + "</para>");
                    sb.AppendLine("         /// <para>precision=" + dr2["precision"] + "</para>");
                    sb.AppendLine("         /// <para>scale=" + dr2["scale"] + "</para>");
                    sb.AppendLine("         /// <para>modify_date=" + dr["modify_date"] + "</para>");


                    sb.AppendLine("         /// <para>create_date=" + dr2["create_date"] + "</para>");
                    sb.AppendLine("         /// </summary>");
                    sb.AppendLine("         public " + gettype(dr2["type"]) + " " + dr2["columnname"] + "{");
                    sb.AppendLine("             get{return this.get<" + gettype(dr2["type"]) + ">(_" + dr["tablename"] + "_." + dr2["columnname"] + ");}");
                    sb.AppendLine("             set{this[_" + dr["tablename"] + "_." + dr2["columnname"] + "]=value;}");
                    sb.AppendLine("         }");
                }
                
                sb.AppendLine("     }");
            }
            sb.AppendLine("}");
            //pb.write(sb.tostr());

            var url = @"E:\com\lxwmvc2\lxwmvcdll\model\models1.cs";
            //写入到对应的文件夹中
            using (StreamWriter sw = new StreamWriter(url, false))
            {
                sw.Write(sb.tostr());
                sw.Close();
            }

            pb.write("OK");
        }

        private static string gettype(object p)
        {
            string p0 = p.tostr();
            if (p0 == "int") return "int";
            if (p0 == "long") return "long";
            if (p0 == "decimal") return "decimal";
            if (p0 == "datetime") return "DateTime";
            return "string";
        }

        /// <summary>
        /// 获取邀请码
        /// </summary>
        /// <param name="pb"></param>
        [json]
        public static void permissionService(pagebase pb)
        {

            

            //返回普通用户
            BaseJson json = pb.JSON<BaseJson>();
            if(core_user.userID != "")
                json.data = new { isUser = true };
        }
    }
}